package com.aizuda.boot.modules.business.template.service;

import com.aizuda.boot.modules.business.template.entity.ContractTemplateEntity;
import com.aizuda.boot.modules.business.template.entity.dto.ContractTemplateAddReqDTO;
import com.aizuda.boot.modules.business.template.entity.vo.ContractTemplateDraftListRespDTO;
import com.aizuda.boot.modules.business.template.entity.vo.ContractTemplateRespDTO;
import com.aizuda.boot.modules.business.template.entity.vo.ContractTemplatesByTypeRespDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import com.aizuda.boot.modules.business.contract.entity.vo.ContractFormDataDTO;

/**
 * 合同模版Service接口
 */
public interface ContractTemplateService extends IService<ContractTemplateEntity> {

    /**
     * 添加或修改合同模版
     *
     * @param dto 请求参数
     * @return 模版ID
     */
    Integer addOrUpdateTemplate(ContractTemplateAddReqDTO dto);

    /**
     * 删除合同模版及其关联字段
     *
     * @param templateId 模版ID
     */
    void deleteTemplate(Integer templateId);

    /**
     * 获取合同模版详情
     *
     * @param templateId 模版ID
     * @return 模版详情
     */
    ContractTemplateRespDTO getTemplateDetail(Integer templateId);

    /**
     * 记录最近使用的模版
     *
     * @param userId 用户ID
     * @param templateId 模版ID
     */
    void recordTemplateUsage(Long userId, Integer templateId);

    /**
     * 获取用户最近使用的模版列表
     *
     * @param userId 用户ID
     * @param limit 返回数量限制
     * @return 模版列表，包含模版基本信息和合同类型信息
     */
    List<Map<String, Object>> getRecentTemplates(Long userId, Integer limit);

    /**
     * 获取用户的模板草稿列表
     *
     * @param employeeId 员工ID
     * @return 模板草稿列表（按合同类型分组）
     */
    ContractTemplateDraftListRespDTO getTemplateDraftList(Long employeeId);

    /**
     * 获取按合同类型分类的所有合同模版
     *
     * @param publisherId 发布人ID
     * @param editable 是否可修改
     * @return 按合同类型分类的模版列表
     */
    ContractTemplatesByTypeRespDTO getAllTemplatesByType(Long publisherId, Boolean editable);

    /**
     * 获取按合同类型分类的所有合同模版（支持模糊搜索）
     *
     * @param publisherId 发布人ID
     * @param editable 是否可修改
     * @param keyword 模板名称关键词
     * @return 按合同类型分类的模版列表
     */
    ContractTemplatesByTypeRespDTO getAllTemplatesByType(Long publisherId, Boolean editable, String keyword);

    /**
     * 根据合同类型ID获取下级合同类型和模版
     *
     * @param contractTypeId 合同类型ID
     * @param publisherId 发布人ID
     * @param editable 是否可修改
     * @return 下级合同类型和模版列表
     */
    ContractTemplatesByTypeRespDTO getTemplatesByContractTypeId(Integer contractTypeId, Long publisherId, Boolean editable);

    /**
     * 根据合同类型ID获取下级合同类型和模版（支持模糊搜索）
     *
     * @param contractTypeId 合同类型ID
     * @param publisherId 发布人ID
     * @param editable 是否可修改
     * @param keyword 模板名称关键词
     * @return 下级合同类型和模版列表
     */
    ContractTemplatesByTypeRespDTO getTemplatesByContractTypeId(Integer contractTypeId, Long publisherId, Boolean editable, String keyword);

    /**
     * 根据模版名称模糊搜索合同模版
     *
     * @param keyword 搜索关键字
     * @return 按合同类型分类的模版列表
     */
    ContractTemplatesByTypeRespDTO searchTemplatesByName(String keyword);

    /**
     * 根据合同类型ID获取模板content
     * 注意：从2025年8月开始，此方法只根据合同类型匹配，不再考虑部门限制
     *
     * @param contractTypeId 合同类型ID
     * @return content的ContractFormDataDTO对象
     */
    ContractFormDataDTO getContentByContractTypeAndDepartment(Integer contractTypeId);

    /**
     * 根据合同类型ID获取模板content，并可选择保存processKey到模板
     *
     * @param contractTypeId 合同类型ID
     * @param departmentId 部门ID（已废弃，保留参数以兼容现有调用）
     * @param templateId 模板ID（可选，如果提供则保存processKey到该模板，但不会覆盖已有的processKey）
     * @return content的ContractFormDataDTO对象
     */
    ContractFormDataDTO getContentByContractTypeAndDepartment(Integer contractTypeId, Long departmentId, Integer templateId);

    /**
     * 根据processKey更新相关模板的content
     *
     * @param processKey 流程Key
     */
    void updateTemplateContentByProcessKey(String processKey);

    /**
     * 根据processId更新相关模板的content
     * 逻辑：根据processId查询对应的processKey，然后更新所有具有该processKey的模板content
     *
     * @param processId 流程ID
     */
    void updateTemplateContentByProcessId(Long processId);
}